package com.chongchong.online.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.chongchong.common.constant.ErrorCodeEnum;
import com.chongchong.core.mp.object.MyModelUtil;
import com.chongchong.core.mp.object.MyOrderParam;
import com.chongchong.core.mp.support.Query;
import com.chongchong.core.tool.api.R;
import com.chongchong.online.dto.OnlineDblinkDto;
import com.chongchong.online.entity.OnlineDblink;
import com.chongchong.online.object.SqlTable;
import com.chongchong.online.object.SqlTableColumn;
import com.chongchong.online.service.IOnlineDblinkService;
import com.chongchong.online.vo.OnlineDblinkVo;
import com.chongchong.online.wrapper.OnlineDblinkWrapper;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 数据库链接操作控制器类。
 *
 * @author Jerry
 * @date 2021-06-06
 */
@Api(tags = "数据库链接操作接口")
@Slf4j
@RestController
@AllArgsConstructor
@RequestMapping("/onlinedblink")
public class OnlineDblinkController {

    private IOnlineDblinkService onlineDblinkService;

    /**
     * 列出符合过滤条件的数据库链接列表。
     *
     * @param onlineDblinkDtoFilter 过滤对象。
     * @param orderParam            排序参数。
     * @param query             分页参数。
     * @return 应答结果对象，包含查询结果集。
     */
    @GetMapping("/list")
	public R<IPage<OnlineDblinkVo>> list(OnlineDblinkDto onlineDblinkDtoFilter,
										 MyOrderParam orderParam, Query query) {
		OnlineDblink onlineDblinkFilter = MyModelUtil.copyTo(onlineDblinkDtoFilter, OnlineDblink.class);
		String orderBy = MyOrderParam.buildOrderBy(orderParam, OnlineDblink.class);
		List<OnlineDblink> onlineDblinkList =
			onlineDblinkService.getOnlineDblinkListWithRelation(onlineDblinkFilter, orderBy);

//		IPage<OnlineTable> pages = onlineTableService.page(Condition.getPage(query), Condition.getQueryWrapper(flowWorkOrder));

		IPage<OnlineDblink> pages = new Page<>(query.getCurrent(), query.getSize());
		pages.setRecords(onlineDblinkList);

		return R.data(OnlineDblinkWrapper.build().pageVO(pages));
	}

	@GetMapping("/listDblinkNoPage")
	public R<List<OnlineDblinkVo>> listDblinkNoPage(OnlineDblink onlineDblink) {
//		String orderBy = MyOrderParam.buildOrderBy(orderParam, OnlineDblink.class);
		List<OnlineDblink> onlineDblinkList = onlineDblinkService.getOnlineDblinkListWithRelation(onlineDblink, null);
		return R.data(OnlineDblinkWrapper.build().listVO(onlineDblinkList));
	}

    /**
     * 获取指定数据库链接下的所有动态表单依赖的数据表列表。
     *
     * @param dblinkId 数据库链接Id。
     * @return 所有动态表单依赖的数据表列表
     */
    @GetMapping("/listDblinkTables")
    public R<List<SqlTable>> listDblinkTables(@RequestParam Long dblinkId) {
        OnlineDblink dblink = onlineDblinkService.getById(dblinkId);
        if (dblink == null) {
            return R.fail(ErrorCodeEnum.DATA_NOT_EXIST.getErrorMessage());
        }
        return R.data(onlineDblinkService.getDblinkTableList(dblink));
    }

	/**
	 * 获取指定数据库链接下，指定数据表的所有字段信息。
	 *
	 * @param dblinkId  数据库链接Id。
	 * @param tableName 表名。
	 * @return 该表的所有字段列表。
	 */
    @GetMapping("/listDblinkTableColumns")
    public R<List<SqlTableColumn>> listDblinkTableColumns(@RequestParam Long dblinkId, @RequestParam String tableName) {
        OnlineDblink onlineDblink = onlineDblinkService.getById(dblinkId);
        if (onlineDblink == null) {
            return R.fail(ErrorCodeEnum.DATA_NOT_EXIST.getErrorMessage());
        }
        return R.data(onlineDblinkService.getDblinkTableColumnList(onlineDblink, tableName));
    }
}
